#include<iostream>

#ifndef projet_mo_forme_h
#define projet_mo_forme_h

// #################### CLASSE POINT2D ################### 
class point2D
{
public:
    // ATTRIBUTS
    float m_x;
    float m_y;
    
    // CONSTRUCTEURS
    point2D();
    point2D(float, float);
    point2D(point2D const &);
    
    // METHODES
    float getX();
    float getY();
    void setX(float);
    void setY(float);
    void affiche();
};

// ############ CLASSE OBJET_BASE "ABSTRAITE" ############
class objet_base
{
protected:
    point2D m_ptOrigine;
    int m_id;
    int m_type;
public:
    // CONSTRUCTEURS
    objet_base();
    objet_base(point2D, int, int);
    // METHODES
    void setPtO(point2D);
    point2D getPtO();
    int getType();
    int getId();
    virtual void affiche();
    virtual void translation();
};

// ###################### CLASSE CERCLE ##################### 
class cercle: public objet_base
{
protected:
    float m_rayon;
public:
    // CONSTRUCTEURS
    cercle();
    cercle(float, point2D const &, int, int);
    // METHODES
    float getR();
    void setR(float);
    void affiche();
    void translation();
};

// #################### CLASSE ARC CERCLE ###################
class arc_cercle: public cercle
{
private:
    float m_angle1;
    float m_angle2;
public:
    // CONSTRUCTEURS
    arc_cercle();  
    arc_cercle(float, float, float, point2D, int, int);
    // METHODES
    float getA1();
    float getA2();
    void setA1(float);
    void setA2(float);
    void affiche();
    void translation();
};

// ###################### CLASSE DISQUE ####################
class disque: public cercle
{
private:
    point2D m_centre2;
    float m_rayon2;
public:
    //CONSTRUCTEURS
    disque();
    disque(point2D, float, float, point2D, int, int);
    // METHODES
    float getR2();
    point2D getC2();
    void setR2(float);
    void setC2(point2D);
    virtual void affiche();
    void translation();
};

// ###################### CLASSE SEGMENT #####################
class segment: public objet_base
{
private:
    float m_l;
public:
    // CONSTRUCTEURS
    segment();
    segment(float, point2D, int, int);
    //METHODES
    float getL();
    void setL(float);
    void affiche();
    void translation();
};

// ###################### CLASSE MULTI SEGMENT #####################
class multi_segment: public segment
{
private:
    segment m_tabSeg[10];
    int m_nbSeg;
public:
    // CONSTRUCTEURS
    multi_segment();
    multi_segment(segment *, int);
    //METHODES
    void affiche();
};

// ####################### CLASSE TRIANGLE  ######################
class triangle: public objet_base
{
private:
    point2D m_ptDeux;
	point2D m_ptTrois;
public:
    // CONSTRUCTEURS
    triangle();
    triangle(point2D, point2D, point2D, int, int);
    // METHODES;
	point2D getPT2();
	point2D getPT3();
	void setPT2(point2D);
	void  setPT3(point2D);
    void affiche();
    void translation();
};

// ###################### CLASSE RECTANGLE #####################
class rectangle: public objet_base
{
private:
    point2D m_pt_bas_droit;
public:
    // CONSTRUCTEURS
    rectangle();
    rectangle(point2D, point2D, int, int);
    // METHODES
    point2D getPT();
    float getL();
    void setPT(point2D);
    void setL(float);
    void affiche();
    void translation();
};

#endif
